package eva.savant.business.ventas.service.util;

public class CodigoControl {
	

  	public static int redondearNumero( double numero, int decimales ) {
    	
    	return (new Double(Math.round(numero*Math.pow(10,decimales))/Math.pow(10,decimales))).intValue();    	
  	}

    
	private static String getVerhoeff(String cifra) {
		
		String cifraVerhoeff1= ""+ Algoritmo.obtenerVerhoeff(cifra);
		
		String cifraVerhoeff2= ""+ Algoritmo.obtenerVerhoeff(cifra + cifraVerhoeff1);
		
		return  cifra+cifraVerhoeff1+cifraVerhoeff2;
	}
	

	private static int[] getVerhoeffSuma(String cifra) {
		
		int cifraVerhoeff[] = new int[5];
		
		cifraVerhoeff[0]= Algoritmo.obtenerVerhoeff(cifra);
		
		cifraVerhoeff[1]= Algoritmo.obtenerVerhoeff(cifra + cifraVerhoeff[0]);

		cifraVerhoeff[2]= Algoritmo.obtenerVerhoeff(cifra + cifraVerhoeff[0] + cifraVerhoeff[1]);
		
    	cifraVerhoeff[3]= Algoritmo.obtenerVerhoeff(cifra + cifraVerhoeff[0] + cifraVerhoeff[1] + cifraVerhoeff[2]);

		cifraVerhoeff[4]= Algoritmo.obtenerVerhoeff(cifra + cifraVerhoeff[0] + cifraVerhoeff[1] + cifraVerhoeff[2] + cifraVerhoeff[3]);

		return cifraVerhoeff;
	}
		

	private static int sumatoriaTotalASCII(String cadena) {
		
		int suma= 0;
		
		for(int i=0; i<cadena.length(); i++)

		suma= suma + ((int)cadena.charAt(i));
		
		return suma;
	}

		
	private static int[] sumatoriaParcialASCII(String cadena) {
		
		
		int suma[]= new int [5];
		
		
		for(int i=0; i<cadena.length(); i= i+5 ) 
		suma[0]= suma[0] + ((int)cadena.charAt(i  ));
		
		for(int i=1; i<cadena.length(); i= i+5 ) 
		suma[1]= suma[1] + ((int)cadena.charAt(i));
		
		for(int i=2; i<cadena.length(); i= i+5 ) 
		suma[2]= suma[2] + ((int)cadena.charAt(i));
		
		for(int i=3; i<cadena.length(); i= i+5 ) 
		suma[3]= suma[3] + ((int)cadena.charAt(i));
		
		for(int i=4; i<cadena.length(); i= i+5 ) 
		suma[4]= suma[4] + ((int)cadena.charAt(i));
	
		
		return suma;
	}


	public static String getCodigoControl(String numAutorizacion, String numFactura, String numNITCliente, String fechaTrans, double montoTrans, String llaveDosifi) throws Exception {
        
		System.out.println("DATOS FACT: "+numAutorizacion+" - "+numFactura+" - "+numNITCliente+" - "+fechaTrans+" - "+montoTrans+" - "+llaveDosifi);
				
		String numeroAutorizacion= numAutorizacion;	
		String numeroFactura     = getVerhoeff(numFactura   );
		String numeroNITCliente  = getVerhoeff(numNITCliente);		
		String fechaTransacion   = getVerhoeff(fechaTrans   );
		String montoTransacion   = getVerhoeff(redondearNumero(montoTrans,0)+"");	
		String llaveDosificacion = llaveDosifi;	
		
		
		Long sumaVerhoeff= (new Long(numeroFactura))+(new Long(numeroNITCliente))+(new Long(fechaTransacion))+(new Long(montoTransacion));
		
		
		int numeroVerhoeff[]= getVerhoeffSuma(sumaVerhoeff.longValue()+"");
		
		
		int indice= 0;
		String cadena1= llaveDosificacion.substring(indice,indice+numeroVerhoeff[0]+1); indice= indice + numeroVerhoeff[0]+1;
		String cadena2= llaveDosificacion.substring(indice,indice+numeroVerhoeff[1]+1); indice= indice + numeroVerhoeff[1]+1;
		String cadena3= llaveDosificacion.substring(indice,indice+numeroVerhoeff[2]+1); indice= indice + numeroVerhoeff[2]+1;
		String cadena4= llaveDosificacion.substring(indice,indice+numeroVerhoeff[3]+1); indice= indice + numeroVerhoeff[3]+1;
		String cadena5= llaveDosificacion.substring(indice,indice+numeroVerhoeff[4]+1); indice= indice + numeroVerhoeff[4]+1;
		
				
		numeroAutorizacion= numeroAutorizacion + cadena1;
		numeroFactura=      numeroFactura      + cadena2;
		numeroNITCliente=   numeroNITCliente   + cadena3;	
		fechaTransacion=    fechaTransacion    + cadena4;	
		montoTransacion=    montoTransacion    + cadena5;
		
		
		String sumaConcatenada= numeroAutorizacion + numeroFactura + numeroNITCliente + fechaTransacion + montoTransacion;
		
		String llaveCifrado= llaveDosificacion + numeroVerhoeff[0] + numeroVerhoeff[1] + numeroVerhoeff[2] + numeroVerhoeff[3] + numeroVerhoeff[4];  
		
		
		String cadenaCifrada= Algoritmo.cifrarMensajeRC4(sumaConcatenada, llaveCifrado).replaceAll("-","");
		
		
		int sumTotalASCII= sumatoriaTotalASCII(cadenaCifrada);
		
		int sumParcialASCII[]= sumatoriaParcialASCII(cadenaCifrada);
		
		sumParcialASCII[0]= (sumParcialASCII[0] * sumTotalASCII) / (numeroVerhoeff[0]+1);		
		sumParcialASCII[1]= (sumParcialASCII[1] * sumTotalASCII) / (numeroVerhoeff[1]+1);
		sumParcialASCII[2]= (sumParcialASCII[2] * sumTotalASCII) / (numeroVerhoeff[2]+1);
		sumParcialASCII[3]= (sumParcialASCII[3] * sumTotalASCII) / (numeroVerhoeff[3]+1);
		sumParcialASCII[4]= (sumParcialASCII[4] * sumTotalASCII) / (numeroVerhoeff[4]+1);


        int sumaASCII= sumParcialASCII[0] + sumParcialASCII[1] + sumParcialASCII[2] + sumParcialASCII[3] + sumParcialASCII[4];
        
        
        String cadenaBase64= Algoritmo.obtenerBase64(sumaASCII);
        

		return Algoritmo.cifrarMensajeRC4(cadenaBase64, llaveCifrado);
				
	}

    public static void main(String arg[]) throws Exception {

        String llaveDosifi="XcT7WUHwFZjRvYSfqzDg%7NsqkWm#_C8x_[-w{R3rf(eTDsx4($@7+q78ysJLS={";
        
        String numAutorizacion="2004003265970";
        
        String numFactura="41054";

        String numNITCliente="3931767";

        String fechaTrans="20071222";
        
        double montoTrans= 20410;

        String res= getCodigoControl(numAutorizacion,numFactura,numNITCliente,fechaTrans,montoTrans,llaveDosifi);

        System.out.println("CODIGO: "+res);
    }
	
}